﻿// Inner Fire 游戏引擎库
// DirectX UI - 基础定义类
// 所属层级：第1层，基础结构类
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-28

#pragma once

#include <DirectXMath.h>
#include <base_struct.h>
#include <memory>
#include <string>
#include <xml_reader.h>

using namespace DirectX;
using namespace ikit;

namespace ifire::dx {
// 定义水平对齐的枚举
enum class HorizontalAlignment { LEFT, CENTER, RIGHT };
// 定义垂直对齐的枚举
enum class VerticalAlignment { TOP, MID, BOTTOM };
// 快捷方式（原来的名称太长了）
using HAlign = HorizontalAlignment;
using VAlign = VerticalAlignment;

// ZINDEX的最大值
constexpr float MAX_ZINDEX = 1000.0f;

// UI项目的对齐方式
struct UIAlign {
  HorizontalAlignment horizontal;
  VerticalAlignment vertical;

  constexpr UIAlign()
      : horizontal(HorizontalAlignment::CENTER)
      , vertical(VerticalAlignment::MID){};

  constexpr UIAlign(
      HorizontalAlignment _horizontal, VerticalAlignment _vertical)
      : horizontal(_horizontal), vertical(_vertical){};

  static UIAlign GetAlign(int grid_num);
  // 根据文字的大小和对齐方式，返回第一个文字的左上角位置。
  static XMFLOAT2 CalcTextStart(XMFLOAT2 text_size, const UIAlign& text_align,
      XMFLOAT2 parent_position, XMFLOAT2 parent_size);
};

// 默认的项目
constexpr UIAlign UIALIGN_TOP_LEFT = {HAlign::LEFT, VAlign::TOP};
constexpr UIAlign UIALIGN_TOP_CENTER = {HAlign::CENTER, VAlign::TOP};
constexpr UIAlign UIALIGN_TOP_RIGHT = {HAlign::RIGHT, VAlign::TOP};
constexpr UIAlign UIALIGN_MID_LEFT = {HAlign::LEFT, VAlign::MID};
constexpr UIAlign UIALIGN_MID_CENTER = {HAlign::CENTER, VAlign::MID};
constexpr UIAlign UIALIGN_MID_RIGHT = {HAlign::RIGHT, VAlign::MID};
constexpr UIAlign UIALIGN_BOTTOM_LEFT = {HAlign::LEFT, VAlign::BOTTOM};
constexpr UIAlign UIALIGN_BOTTOM_CENTER = {HAlign::CENTER, VAlign::BOTTOM};
constexpr UIAlign UIALIGN_BOTTOM_RIGHT = {HAlign::RIGHT, VAlign::BOTTOM};

// UI的通用信息
struct UIWidget {
  // 此UI的位置
  XMFLOAT2 position;
  // 此UI的大小
  XMFLOAT2 size;
  // 此UI的缩放
  XMFLOAT2 scale;
  // 此UI的对齐方式
  UIAlign align;
  // 此UI的对齐Anchor。左上角为0,0，右下角为1,1，中间为0.5,0.5
  XMFLOAT2 anchor;
  // 此UI的Zindex
  float zindex;

  UIWidget();
  UIWidget(const XmlNode& node);

  XMFLOAT2 GetPosition(const XMFLOAT2& parent_position,
      const XMFLOAT2& parent_size, const XMFLOAT2& parent_scale) const;
  UIWidget CalcWidget(const UIWidget& parent_widget) const;

  inline float GetZ() const { return MapZ(zindex); }
  inline XMFLOAT2 GetRealSize() const {
    return XMFLOAT2(size.x * scale.x, size.y * scale.y);
  }

  // 判断一个坐标是否在Widget中。计算出最终的Widget之后再执行此判断。
  // 设Position为项目的中心点。
  bool IsHit(XMFLOAT2 pos) const;

  // 将ZIndex转化为HLSL中的Z值。
  static float MapZ(float zindex);
};

} // namespace ifire::dx